package com.xblibo.xruth.common;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import com.xblibo.xruth.exception.OtherException;

/**
 * <p>Title: BaseService.java </p>
 * <p>Description:  </p>
 * <p>Copyright: 易宝 2011*版权所有 </p>
 * <p>Company: yeepay </p>
 * @author xblibo
 * @version 1.0 ,  2011  下午10:12:52
 */
public interface BaseService<T,PK extends Serializable> {
	/**
	 * 保存新增或修改的对象.
	 * 
	 * @param  entity  实体对象
	 */
	public void saveOrUpdate(final T entity)throws OtherException;
	
	/**
	 * 批量保存新增或修改的对象.
	 * 
	 * @param  entitys  实体对象集合
	 */
	public void saveOrUpdateAll(final Collection<T> entitys)throws OtherException;
	
	/**
	 * 删除对象.
	 * 
	 * @param entity 对象必须是session中的对象或含id属�?�的transient对象.
	 */
	public void delete(final T entity) throws OtherException;
	

	/**
	 * 按id删除对象.
	 * 
	 * @param   PK    主键ID
	 */
	public void delete(final PK id)throws OtherException;
	
	/**
	 * 批量删除实体对象
	 * 
	 * @param entitys 实体对象集合
	 */
	public void deleteAll(final Collection<T> entitys)throws OtherException;
	
	 /** 
     * 查找指定ID实体类对�? 
     *  
     * @param id Class<T> entityClass,
     *            实体ID 
     * @return T 实体对象 
     */  
    public T findById(final PK id)throws OtherException;
    
	
	/**
	 * 查找�?有对�?
	 * 
	 * @param entityClass 
     *            实体 
	 */
	public List<T> findAll()throws OtherException;
	
	  
    /** 
     * 模糊查询指定条件对象集合 <br> 
     * 用法：可以实例化�?个空的T对象，需要查询某个字段，就set该字段的条件然后调用本方�?<br> 
     * 缺点：目前测试貌似只能支持String的模糊查询，虽然有办法重写，但没必要，其他用HQL<br> 
     *  
     * @param entity 
     *            条件实体 
     * @return 结合 
     */  
    //public List<T> findByExample(final T entity)throws OtherException;
    
    /**
	 * 按属性查找唯一对象,匹配方式为相等.
	 */
	public T findUniqueBy(final String propertyName, final Object value)throws OtherException;
	
	/**
	 * 按HQL查询对象列表.
	 * 
	 * @param values 数量可变的参数,按顺序绑定.
	 */
	public <X> List<X> find(final String hql, final Object... values)throws OtherException;
	
	/**
	 * 按属性查找对象列表,匹配方式为相等.
	 */
	public <X> List<X> findBy(final String propertyName, final Object value)throws OtherException;
	
	
	/**
	 * 按id列表获取对象.
	 */
	public List<T> findByIds(List<PK> ids)throws OtherException;

	/**
	 * 按HQL查询对象列表.
	 * 
	 * @param values 命名参数,按名称绑定.
	 */
	public <X> List<X> find(final String hql, final Map<String, ?> values) throws OtherException;


	/**
	 * 按HQL查询唯一对象.
	 * 
	 * @param values 命名参数,按名称绑定.
	 */
	public <X> X findUnique(final String hql, final Map<String, ?> values) throws OtherException;
    
}
